/*
 * Mayin.java
 *
 * Created on 28 de abril de 2007, 15:51
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.Mayin1010;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
/**
 *
 * @author Administrador
 */
public class Mayin implements Tactica{
    
    private int nValores[][]={
        {-150,5,5},  // Jugador 1[0]
        {-120,25,6},  // Jugador 2[1]
        {-120,-25,6},  // Jugador 3[2]
        {-111,-23,6},  // Jugador 4[3]
        {-65,-83,6},  // Jugador 5[4]
        {-65,83,6},  // Jugador 6[5]
        {0,0,6},  // Jugador 7[6]
        {100,-70,7},  // Jugador 8[7]
        {100,70,7},  // Jugador 9[8]
        {120,-20,7},  // Jugador 10[9]
        {120,20,7}  // Jugador 11[10]
    };

    
    public Color getColor1() {
        return Color.black;
    }

    public Color getColor2() {
        return Color.black;
    }

    public Color getColorNumero() {
        return Color.white;
    }
      
    public String getNombre() {
        return "Mayin1010";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        //Movimiento portero
        double y=bola.getY(), x=bola.getX();
        if (y < -35) y=-15;
        if (y > 35) y=15;
          com.add(new ComandoIrA(0,nValores[0][0], y));
        if ((x < -125 && y < 40) || (x < -125 && y>-40)){
          com.add(new ComandoIrA(0,x,y));  
          if (y<0) y= -120;
          if (y>0) y= 120;
          com.add(new ComandoGolpearBola(0, -140, y));
        }    
        //Mejorar defensa
        int d, defensa1=0, defensa2=0, defensa3=0, defensa4=0, defensa5, defensa6;
        double temp;
        temp=contrarios[0].getX();
        for (d=1; d<11; d++){
          if (temp > contrarios[d].getX()) defensa1=d;
          else temp=contrarios[d].getX();}
        temp=contrarios[0].getX();
        for (d=1; d<11; d++){
          if (temp > contrarios[d].getX() && d !=defensa1) defensa2=d;
          else temp=contrarios[d].getX();}
        temp=contrarios[0].getX();
        for (d=1; d<11; d++){
           if (temp > contrarios[d].getX() && d !=defensa1 && d !=defensa2) defensa3=d;
           else temp=contrarios[d].getX();}
        temp=contrarios[0].getX();
        for (d=1; d<11; d++){
          if (temp > contrarios[d].getX() && d !=defensa1 && d !=defensa2 && d !=defensa3) defensa4=d;
          else temp=contrarios[d].getX();}
        for (d=0; d<11; d++)
            nValores[d][2]=1;
        com.add(new ComandoIrA(3, contrarios[defensa1].getX(), contrarios[defensa1].getY()));
        com.add(new ComandoIrA(4, contrarios[defensa2].getX(), contrarios[defensa2].getY()));
        com.add(new ComandoIrA(5, contrarios[defensa3].getX(), contrarios[defensa3].getY()));
        com.add(new ComandoIrA(6, contrarios[defensa4].getX(), contrarios[defensa4].getY()));
        
        //Movimiento mas cercano a la bola
        int dev[]={-1,999};
        int nDis;
        for (int n=1;n<11;n++){
            nDis=(int)General.getDistancia(jugadores[n].getX(), jugadores[n].getY(), bola.getX(), bola.getY());
                    if (nDis<dev[1]){
                        dev[0]=n;
                        dev[1]=nDis;
                     }
           }
        int nJug=dev[0];
        //int nJug=sj.getMasCercanoDeBola(jugadores,bola, 0, 0);
        if (jugadores[0].getY() >50 || jugadores[0].getY() < -50 )
           com.add(new ComandoIrA(0,-150, 5));
                
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        
        //       com.add(new ComandoGolpearBola(nJug, -140, y));
        
            lanzarBolaMejor(sj, com);
                return com;
    }
    
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>50)
                com.add(new ComandoTiroAPuerta(n,15));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
    
}
